package org.codingq92.basic.thread;

import java.util.concurrent.CountDownLatch;

public class MultiCountDownLatch {
    public static void main(String[] args) throws InterruptedException {
        // 1. 开始信号：让3个准备线程同时启动（初始值1）
        CountDownLatch startLatch = new CountDownLatch(1);
        // 2. 完成信号：让主线程等待3个工作线程（初始值3）
        CountDownLatch doneLatch = new CountDownLatch(3);

        // 创建3个“准备线程”（会阻塞等待开始信号）
        for (int i = 1; i <= 3; i++) {
            final int threadId = i;
            new Thread(() -> {
                try {
                    System.out.println("准备线程" + threadId + "：等待开始信号...");
                    startLatch.await(); // 多个线程在此阻塞

                    // 收到信号后执行任务
                    System.out.println("工作线程" + threadId + "：开始执行");
                    Thread.sleep(1000);
                    System.out.println("工作线程" + threadId + "：执行完成");

                    doneLatch.countDown(); // 完成后计数器减1
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
        }

        // 主线程准备工作
        Thread.sleep(2000);
        System.out.println("主线程：发送开始信号！");
        startLatch.countDown(); // 唤醒所有等待的准备线程

        // 主线程也阻塞等待所有工作完成
        doneLatch.await();
        System.out.println("主线程：所有工作已完成，程序结束");
    }
}
